Examining the 2014 Seattle and San Francisco summer crime data, as reported by the police, I noticed that San Francisco, despite having a population of less than 30 percent greater than the population of Seattle, had more than twice as many recorded cases of drug crime. Does this reflect a greater rate of use of certain drugs in San Francisco than in Seattle, or, rather, perhaps a difference in the manner of enforcement of drug laws or the manner in which reported infractions are recorded? Digging somewhat deeper—examining the data from 2013 through 2017 and on the use of certain popular drugs—I uncovered some striking trends and obtained some possible insight into these questions.
Examining the Seattle crime data from 2013 through 2017, one of the first things I noticed was a dramatic increase in the number of incidences of crime reflected in the police data. As the following plot of incidences of crime within some selected categories shows, the fractional increase in incidences of crime in the data is roughly the same across the various categories of crime.

San Francisco has seen no such increase. Furthermore, there is no evidence of the massive crime wave in Seattle that this data would suggest, if the increase were taken to reflect the actual increase in crime. For example, there are reports of recent increases of use of some drugs, particularly heroin, but nothing close to the more than 100 percent increase in use, from one year to the next, that the data on drug crime in Seattle might seem to suggest.
Looking somewhat deeper at the recorded cases of illegal drug use in the two cities, let’s consider the differences between crimes that would be considered trafficking and those that would be considered possession.
library(stringr)
seattle_drugs_13_17 <- seattle_complete %>%
filter(Category == "Drugs" & Year %in% c(2013:2017))
SF_drugs_13_17 <- SF_complete %>%
mutate(`Cited or Arrested` = (str_detect(Resolution, "ARREST") |
str_detect(Resolution, "CITED"))) %>%
filter(Category == "Drugs" & Year %in% c(2013:2017))
SF_drugs_13_17 <- SF_drugs_13_17 %>%
mutate(`Drug Offense Type` =
ifelse(str_detect(Descript, "LAB APPARATUS"), "Sales, Transportation, or Production",
ifelse(str_detect(Descript, "POSSESSION"), "Possession",
ifelse(str_detect(Descript, "SALE"), "Sales, Transportation, or Production",
ifelse(str_detect(Descript, "TRANSPORT"), "Sales, Transportation, or Production",
ifelse(str_detect(Descript, "PLANTING/CULTIVATING MARIJUANA"),
"Sales, Transportation, or Production",
"Other"
))))))
seattle_drugs_13_17 <- seattle_drugs_13_17 %>%
mutate(`Drug Offense Type` =
ifelse(str_detect(`Offense Type`, "POSSESS"), "Possession",
ifelse(str_detect(`Offense Type`, "FOUND"), "Possession",
ifelse(str_detect(`Offense Type`, "DISTRIBUTE"),
"Sales, Transportation, or Production",
ifelse(str_detect(`Offense Type`, "SMUGGLE"),
"Sales, Transportation, or Production",
ifelse(str_detect(`Offense Type`, "PRODUCE"),
"Sales, Transportation, or Production",
ifelse(str_detect(`Offense Type`, "SELL"),
"Sales, Transportation, or Production",
ifelse(str_detect(`Offense Type`, "TRAFFIC"),
"Sales, Transportation, or Production",
"Other"))))))))
joined_counts <- (seattle_drugs_13_17 %>% count(Year, `Drug Offense Type`)) %>%
left_join((SF_drugs_13_17 %>% count(Year, `Drug Offense Type`)), by = c("Year", "Drug Offense Type")) %>%
gather(n.x, n.y, key = City, value = Incidents) %>%
mutate(City = fct_recode(City,
Seattle = "n.x",
`San Francisco` = "n.y"))
#reformat some categories that will appear in the plot
joined_counts <- joined_counts %>%
mutate(`Drug Offense Type` = as.factor(`Drug Offense Type`)) %>%
mutate(`Drug Offense Type` =
fct_recode(`Drug Offense Type`,
" Sales, Transportation,\nor Production" = "Sales, Transportation, or Production",
" Possession" = "Possession"))
plot <- ggplot(joined_counts %>% filter(`Drug Offense Type` != "Other")) +
geom_col(aes(x = Year, y = Incidents, fill = City, color = `Drug Offense Type`),
position = "dodge") +
theme(legend.title = element_blank()) +
labs(x = "year", y = "count",
title = "Drug-related Police Incidents: possession versus trafficking")
ggplotly(plot) %>% layout(margin = list(b = 50, l = 60, r = 10, t = 80))
seattle_drugs_13_17 <- seattle_drugs_13_17 %>%
mutate(`Drug Type` = ifelse(str_detect(`Offense Type`, "MARIJU"), "Marijuana", #yes
ifelse(str_detect(`Offense Type`, "METH"), "Methamphetamine", #yes
ifelse(str_detect(`Offense Type`, "COCAINE"), "Cocaine", #yes
ifelse(str_detect(`Offense Type`, "HEROIN"), "Heroin", #yes
ifelse(str_detect(`Offense Type`, "PRESCRIPTION"), "Prescription", #?
ifelse(str_detect(`Offense Type`, "PILL/TABLET"), "Pill/Tablet", #?
ifelse(str_detect(`Offense Type`, "HALLUCINOGEN"), "Hallucinogen",
ifelse(str_detect(`Offense Type`, "SYNTHETIC"), "Synthetic", #?
ifelse(str_detect(`Offense Type`, "AMPHETAMINE"), "Amphetamine", #yes
ifelse(str_detect(`Offense Type`, "OPIUM"), "Opium", #yes
ifelse(str_detect(`Offense Type`, "PARAPHENALIA"), "Paraphernalia", #yes
"Other")
)))))))))))
SF_drugs_13_17 <- SF_drugs_13_17 %>%
mutate(`Drug Type` = ifelse(str_detect(Descript, "MARIJUANA"), "Marijuana", #yes
ifelse(str_detect(Descript, "COCAINE"), "Cocaine",
ifelse(str_detect(Descript, "METH-AMPHETAMINE"), "Methamphetamine",
ifelse(str_detect(Descript, "BARBITUATES"), "Barbituates",
ifelse(str_detect(Descript, "CONTROLLED SUBSTANCE"),
"Controlled Substance",
ifelse(str_detect(Descript, "HALLUCINOGENIC"), "Hallucinogenic",
ifelse(str_detect(Descript, "AMPHETAMINE"), "Amphetamine",
ifelse(str_detect(Descript, "METHADONE"), "Methadone",
ifelse(str_detect(Descript, "PARAPHERNALIA"), "Paraphernalia",
ifelse(str_detect(Descript, "OPIATES"), "Opiates",
ifelse(str_detect(Descript, "OPIUM"), "Opium",
ifelse(str_detect(Descript, "HEROIN"), "Heroin",
"Other")
))))))))))))
ggplot(SF_drugs_13_17) +
geom_bar(aes(`Drug Type`)) +
labs(title = "San Francisco") +
theme(axis.text.x = element_text(angle = 75, hjust = 1, vjust = 1))

seattle_selected_drugs <- seattle_drugs_13_17 %>%
filter(`Drug Type` %in% c("Marijuana", "Cocaine", "Methamphetamine", "Heroin"))
SF_selected_drugs <- SF_drugs_13_17 %>%
filter(`Drug Type` %in% c("Marijuana", "Cocaine", "Methamphetamine", "Heroin"))
ggplot(seattle_selected_drugs) +
geom_bar(aes(`Drug Type`)) +
labs(title = "Seattle") +
theme(axis.text.x = element_text(angle = 65, hjust = 1, vjust = 1))

ggplot(SF_selected_drugs) +
geom_bar(aes(`Drug Type`)) +
labs(title = "San Francisco") +
theme(axis.text.x = element_text(angle = 75, hjust = 1, vjust = 1))

joined_drug_counts <- (seattle_selected_drugs %>% count(Year, `Drug Type`)) %>%
left_join((SF_selected_drugs %>% count(Year, `Drug Type`)), by = c("Year", "Drug Type"))
joined_drug_counts <- joined_drug_counts %>%
rename(Seattle = n.x, `San Francisco` = n.y) %>%
gather(Seattle, `San Francisco`, key = City, value = count)
plt <- ggplot(joined_drug_counts) + geom_col(aes(x = Year, y = count, fill = City, color = `Drug Type`),
position = "dodge")
ggplotly(plt) %>% layout(margin = list(b = 50, l = 60, r = 10, t = 80))
library(lubridate)
library(gridExtra)
#fig.height = 2, fig.width = 3
#seattle_drugs_13_17 <- seattle_drugs_13_17 %>%
# mutate(R_date = floor_date(mdy_hms(`Occurred Date or Date Range Start`,
# tz = "PST8PDT"), "day"))
#SF_drugs_13_17 <- SF_drugs_13_17 %>%
# mutate(R_date = mdy(Date, tz = "PST8PDT"))
seattle_selected_drugs <- seattle_drugs_13_17 %>%
filter(`Drug Type` %in% c("Marijuana", "Cocaine", "Methamphetamine", "Heroin"))
SF_selected_drugs <- SF_drugs_13_17 %>%
filter(`Drug Type` %in% c("Marijuana", "Cocaine", "Methamphetamine", "Heroin"))
number_of_bins <- 78
plt_seattle_selected_drugs <- ggplot(seattle_selected_drugs) +
geom_freqpoly(aes(x = R_date, color = `Drug Type`), bins = number_of_bins) +
scale_x_datetime(date_breaks = "4 months",
limits = c(as.POSIXct("2012/12/31", tz = "PST8PDT"),
as.POSIXct("2018/01/01", tz = "PST8PDT"))) +
theme(axis.text.x = element_text(angle = 65, hjust = 1, vjust = 1)) +
labs(y = "number per fortnight", x = "",
title = "Seattle Police Incidents Related to 4 Popular Drugs",
color = "Drug: ") +
theme(legend.position = "bottom",
plot.title = element_text(size = 9),
axis.title.y = element_text(size = 8),
axis.text.x = element_text(size = 6),
legend.text = element_text(size = 6),
legend.title = element_text(size = 8)) +
guides(size = guide_legend(order = 2))
plt_SF_selected_drugs <- ggplot(SF_selected_drugs) +
geom_freqpoly(aes(x = R_date, color = `Drug Type`), bins = number_of_bins) +
scale_x_datetime(date_breaks = "4 months",
limits = c(as.POSIXct("2012/12/31", tz = "PST8PDT"),
as.POSIXct("2018/01/01", tz = "PST8PDT"))) +
theme(axis.text.x = element_text(angle = 65, hjust = 1, vjust = 1)) +
labs(y = "number per fortnight", x = "",
title = "San Francisco Police Incidents Related to 4 Popular Drugs") +
theme(legend.position = "none",
plot.title = element_text(size = 9),
axis.title.y = element_text(size = 8),
axis.text.x = element_text(size = 6))
plt_seattle_all_13_17 <- seattle_complete %>%
filter(Year %in% 2013:2017) %>%
ggplot(aes(x = R_date)) + geom_freqpoly(bins = number_of_bins) +
scale_x_datetime(date_breaks = "4 months",
limits = c(as.POSIXct("2012/12/31", tz = "PST8PDT"),
as.POSIXct("2018/01/01", tz = "PST8PDT"))) +
theme(axis.text.x = element_text(angle = 65, hjust = 1, vjust = 1)) +
labs(y = "number per fortnight", x = "",
title = "Seattle Police Incidents: 2013 through 2017") +
theme(plot.title = element_text(size = 9),
axis.title.y = element_text(size = 8),
axis.text.x = element_text(size = 6))
plt_SF_all_13_17 <- SF_complete %>%
filter(Year %in% 2013:2017) %>%
ggplot(aes(x = R_date)) + geom_freqpoly(bins = number_of_bins) +
scale_x_datetime(date_breaks = "4 months",
limits = c(as.POSIXct("2012/12/31", tz = "PST8PDT"),
as.POSIXct("2018/01/01", tz = "PST8PDT"))) +
theme(axis.text.x = element_text(angle = 65, hjust = 1, vjust = 1)) +
labs(y = "number per fortnight", x = "",
title = "San Francisco Police Incidents: 2013 through 2017") +
theme(plot.title = element_text(size = 9),
axis.title.y = element_text(size = 8),
axis.text.x = element_text(size = 6))
grid.arrange(plt_seattle_all_13_17, plt_SF_all_13_17,
plt_SF_selected_drugs, plt_seattle_selected_drugs,
layout_matrix = rbind(c(1, 2),
c(4, 3),
c(4, NA)),
heights = c(5, 5, 1))

NA
LS0tCnRpdGxlOiAnRHJ1Z3MgYW5kIHRoZSBQb2xpY2U6IFNhbiBGcmFuY2lzY28gYW5kIFNlYXR0bGUnCmF1dGhvcjogIlN0dWFydCBCYXJudW0iCmRhdGU6ICIyLzEyLzIwMTgiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCmVkaXRvcl9vcHRpb25zOgogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUKLS0tCgpFeGFtaW5pbmcgdGhlIDIwMTQgU2VhdHRsZSBhbmQgU2FuIEZyYW5jaXNjbyBzdW1tZXIgY3JpbWUgZGF0YSwgYXMgcmVwb3J0ZWQgYnkgdGhlIHBvbGljZSwgSSBub3RpY2VkIHRoYXQgU2FuIEZyYW5jaXNjbywgZGVzcGl0ZSBoYXZpbmcgYSBwb3B1bGF0aW9uIG9mIGxlc3MgdGhhbiAzMCBwZXJjZW50IGdyZWF0ZXIgdGhhbiB0aGUgcG9wdWxhdGlvbiBvZiBTZWF0dGxlLCBoYWQgbW9yZSB0aGFuIHR3aWNlIGFzIG1hbnkgcmVjb3JkZWQgY2FzZXMgb2YgZHJ1ZyBjcmltZS4gRG9lcyB0aGlzIHJlZmxlY3QgYSBncmVhdGVyIHJhdGUgb2YgdXNlIG9mIGNlcnRhaW4gZHJ1Z3MgaW4gU2FuIEZyYW5jaXNjbyB0aGFuIGluIFNlYXR0bGUsIG9yLCByYXRoZXIsIHBlcmhhcHMgYSBkaWZmZXJlbmNlIGluIHRoZSBtYW5uZXIgb2YgZW5mb3JjZW1lbnQgb2YgZHJ1ZyBsYXdzIG9yIHRoZSBtYW5uZXIgaW4gd2hpY2ggcmVwb3J0ZWQgaW5mcmFjdGlvbnMgYXJlIHJlY29yZGVkPyBEaWdnaW5nIHNvbWV3aGF0IGRlZXBlci0tLWV4YW1pbmluZyB0aGUgZGF0YSBmcm9tIDIwMTMgdGhyb3VnaCAyMDE3IGFuZCBvbiB0aGUgdXNlIG9mIGNlcnRhaW4gcG9wdWxhciBkcnVncy0tLUkgdW5jb3ZlcmVkIHNvbWUgc3RyaWtpbmcgdHJlbmRzIGFuZCBvYnRhaW5lZCBzb21lIHBvc3NpYmxlIGluc2lnaHQgaW50byB0aGVzZSBxdWVzdGlvbnMuCgpFeGFtaW5pbmcgdGhlIFNlYXR0bGUgY3JpbWUgZGF0YSBmcm9tIDIwMTMgdGhyb3VnaCAyMDE3LCBvbmUgb2YgdGhlIGZpcnN0IHRoaW5ncyBJIG5vdGljZWQgd2FzIGEgZHJhbWF0aWMgaW5jcmVhc2UgaW4gdGhlIG51bWJlciBvZiBpbmNpZGVuY2VzIG9mIGNyaW1lIHJlZmxlY3RlZCBpbiB0aGUgcG9saWNlIGRhdGEuIEFzIHRoZSBmb2xsb3dpbmcgcGxvdCBvZiBpbmNpZGVuY2VzIG9mIGNyaW1lIHdpdGhpbiBzb21lIHNlbGVjdGVkIGNhdGVnb3JpZXMgc2hvd3MsIHRoZSBmcmFjdGlvbmFsIGluY3JlYXNlIGluIGluY2lkZW5jZXMgb2YgY3JpbWUgaW4gdGhlIGRhdGEgaXMgcm91Z2hseSB0aGUgc2FtZSBhY3Jvc3MgdGhlIHZhcmlvdXMgY2F0ZWdvcmllcyBvZiBjcmltZS4KCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShwbG90bHkpCmxpYnJhcnkobHVicmlkYXRlKQoKU0ZfY29tcGxldGUgPC0gcmVhZF9jc3YoIlNGX0NvbXBsZXRlLmNzdiIpCnNlYXR0bGVfY29tcGxldGUgPC0gcmVhZF9jc3YoInNlYXR0bGVfY29tcGxldGUuY3N2IiwgZ3Vlc3NfbWF4ID0gMTAwMDAwKQojV2l0aCBndWVzcyBtYXggbGFyZ2UgZW5vdWdoLCBjb2x1bW5zIHRoYXQgY29udGFpbiBpbnRlZ2VycyB0aGF0IGV4Y2VlZCB0aGUgCiMzMi1iaXQgbWF4aW11bSBhcmUgcmVhZCBhcyBjaGFyYWN0ZXIgdmVjdG9ycy4KClNGX2NvbXBsZXRlIDwtIFNGX2NvbXBsZXRlICU+JQogIG11dGF0ZShZZWFyID0gYXMuaW50ZWdlcihzdHJfc3ViKERhdGUsIC00LCAtMSkpKSAlPiUKICBtdXRhdGUoQ2F0ZWdvcnkgPSBmY3RfcmVjb2RlKENhdGVnb3J5LAogICAgICAgICJEcnVncyIgPSAiRFJVRy9OQVJDT1RJQyIpKQoKc2VhdHRsZV9jb21wbGV0ZSA8LSBzZWF0dGxlX2NvbXBsZXRlICU+JQogIHJlbmFtZShDYXRlZ29yeSA9IGBTdW1tYXJpemVkIE9mZmVuc2UgRGVzY3JpcHRpb25gKSAlPiUKICBtdXRhdGUoQ2F0ZWdvcnkgPSBmY3RfcmVjb2RlKENhdGVnb3J5LAogICAgICAgICJQcm9zdGl0dXRpb24iID0gIlBST1NUSVRVVElPTiIsCiAgICAgICAgIkRydWdzIiA9ICJOQVJDT1RJQ1MiLAogICAgICAgICJXZWFwb25zIiA9ICJXRUFQT04iLAogICAgICAgICJMaXF1b3Jcbmxhd3MiID0gIkxJUVVPUiBWSU9MQVRJT04iLAogICAgICAgICJBc3NhdWx0IiA9ICJBU1NBVUxUIiwKICAgICAgICAiSG9taWNpZGUiID0gIkhPTUlDSURFIiwKICAgICAgICAiUm9iYmVyeSIgPSAiUk9CQkVSWSIsCiAgICAgICAgIlZlaGljbGVcbnRoZWZ0IiA9ICJWRUhJQ0xFIFRIRUZUIiwKICAgICAgICAiVGhlZnRcbmZyb21cbnZlaGljbGUiID0gIkNBUiBQUk9XTCIpKQoKc2VhdHRsZV9jb21wbGV0ZSA8LSBzZWF0dGxlX2NvbXBsZXRlICU+JQogIG11dGF0ZShSX2RhdGUgPSBmbG9vcl9kYXRlKG1keV9obXMoYE9jY3VycmVkIERhdGUgb3IgRGF0ZSBSYW5nZSBTdGFydGAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eiA9ICJQU1Q4UERUIiksICJkYXkiKSkKClNGX2NvbXBsZXRlIDwtIFNGX2NvbXBsZXRlICU+JQogIG11dGF0ZShSX2RhdGUgPSBtZHkoRGF0ZSwgdHogPSAiUFNUOFBEVCIpKQoKc2VhdHRsZV9jb21wbGV0ZSAlPiUKICBmaWx0ZXIoQ2F0ZWdvcnkgJWluJSAKICAgICAgICBjKCJQcm9zdGl0dXRpb24iLAogICAgICAgICJEcnVncyIsCiAgICAgICAgIldlYXBvbnMiLAogICAgICAgICJBc3NhdWx0IiwKICAgICAgICAiSG9taWNpZGUiLAogICAgICAgICJSb2JiZXJ5IiwKICAgICAgICAiVmVoaWNsZVxudGhlZnQiLAogICAgICAgICJUaGVmdFxuZnJvbVxudmVoaWNsZSIpKSAlPiUKICBmaWx0ZXIoWWVhciAlaW4lIDIwMTM6MjAxNykgJT4lCiAgZ2dwbG90KGFlcyh4ID0gQ2F0ZWdvcnksIGZpbGwgPSBhcy5mYWN0b3IoWWVhcikpKSArCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgZ2d0aXRsZSgiUmVjb3JkZWQgQ2FzZXMgb2YgU2VsZWN0ZWQgQ2F0ZWdvcmllcyBvZiBDcmltZTogU2VhdHRsZSIpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKwogIGxhYnMoZmlsbCA9ICJZZWFyIikKCmBgYApTYW4gRnJhbmNpc2NvIGhhcyBzZWVuIG5vIHN1Y2ggaW5jcmVhc2UuIEZ1cnRoZXJtb3JlLCB0aGVyZSBpcyBubyBldmlkZW5jZSBvZiB0aGUgbWFzc2l2ZSBjcmltZSB3YXZlIGluIFNlYXR0bGUgdGhhdCB0aGlzIGRhdGEgd291bGQgc3VnZ2VzdCwgaWYgdGhlIGluY3JlYXNlIHdlcmUgdGFrZW4gdG8gcmVmbGVjdCB0aGUgYWN0dWFsIGluY3JlYXNlIGluIGNyaW1lLiBGb3IgZXhhbXBsZSwgdGhlcmUgYXJlIHJlcG9ydHMgb2YgcmVjZW50IGluY3JlYXNlcyBvZiB1c2Ugb2Ygc29tZSBkcnVncywgcGFydGljdWxhcmx5IGhlcm9pbiwgYnV0IG5vdGhpbmcgY2xvc2UgdG8gdGhlIG1vcmUgdGhhbiAxMDAgcGVyY2VudCBpbmNyZWFzZSBpbiB1c2UsIGZyb20gb25lIHllYXIgdG8gdGhlIG5leHQsIHRoYXQgdGhlIGRhdGEgb24gZHJ1ZyBjcmltZSBpbiBTZWF0dGxlIG1pZ2h0IHNlZW0gdG8gc3VnZ2VzdC4gCgpMb29raW5nIHNvbWV3aGF0IGRlZXBlciBhdCB0aGUgcmVjb3JkZWQgY2FzZXMgb2YgaWxsZWdhbCBkcnVnIHVzZSBpbiB0aGUgdHdvIGNpdGllcywgbGV0J3MgY29uc2lkZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gY3JpbWVzIHRoYXQgd291bGQgYmUgY29uc2lkZXJlZCB0cmFmZmlja2luZyBhbmQgdGhvc2UgdGhhdCB3b3VsZCBiZSBjb25zaWRlcmVkIHBvc3Nlc3Npb24uCgoKYGBge3IsIGZpZy5oZWlnaHQgPSA1LCBmaWcud2lkdGggPSAxMH0KbGlicmFyeShzdHJpbmdyKQoKc2VhdHRsZV9kcnVnc18xM18xNyA8LSBzZWF0dGxlX2NvbXBsZXRlICU+JQogIGZpbHRlcihDYXRlZ29yeSA9PSAiRHJ1Z3MiICYgWWVhciAlaW4lIGMoMjAxMzoyMDE3KSkKClNGX2RydWdzXzEzXzE3IDwtIFNGX2NvbXBsZXRlICU+JQogIG11dGF0ZShgQ2l0ZWQgb3IgQXJyZXN0ZWRgID0gKHN0cl9kZXRlY3QoUmVzb2x1dGlvbiwgIkFSUkVTVCIpIHwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChSZXNvbHV0aW9uLCAiQ0lURUQiKSkpICU+JQogIGZpbHRlcihDYXRlZ29yeSA9PSAiRHJ1Z3MiICYgWWVhciAlaW4lIGMoMjAxMzoyMDE3KSkKClNGX2RydWdzXzEzXzE3IDwtIFNGX2RydWdzXzEzXzE3ICU+JSAKICBtdXRhdGUoYERydWcgT2ZmZW5zZSBUeXBlYCA9IAogICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoRGVzY3JpcHQsICJMQUIgQVBQQVJBVFVTIiksICJTYWxlcywgVHJhbnNwb3J0YXRpb24sIG9yIFByb2R1Y3Rpb24iLAogICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KERlc2NyaXB0LCAiUE9TU0VTU0lPTiIpLCAiUG9zc2Vzc2lvbiIsCiAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoRGVzY3JpcHQsICJTQUxFIiksICJTYWxlcywgVHJhbnNwb3J0YXRpb24sIG9yIFByb2R1Y3Rpb24iLAogICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KERlc2NyaXB0LCAiVFJBTlNQT1JUIiksICJTYWxlcywgVHJhbnNwb3J0YXRpb24sIG9yIFByb2R1Y3Rpb24iLAogICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KERlc2NyaXB0LCAiUExBTlRJTkcvQ1VMVElWQVRJTkcgTUFSSUpVQU5BIiksIAogICAgICAgICAgICAgICAgICAgICAiU2FsZXMsIFRyYW5zcG9ydGF0aW9uLCBvciBQcm9kdWN0aW9uIiwKICAgICAgICAgICAgICAiT3RoZXIiCiAgICAgICAgICAgICAgKSkpKSkpCgpzZWF0dGxlX2RydWdzXzEzXzE3IDwtIHNlYXR0bGVfZHJ1Z3NfMTNfMTcgJT4lCiAgbXV0YXRlKGBEcnVnIE9mZmVuc2UgVHlwZWAgPSAKICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGBPZmZlbnNlIFR5cGVgLCAiUE9TU0VTUyIpLCAiUG9zc2Vzc2lvbiIsCiAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoYE9mZmVuc2UgVHlwZWAsICJGT1VORCIpLCAiUG9zc2Vzc2lvbiIsCiAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoYE9mZmVuc2UgVHlwZWAsICJESVNUUklCVVRFIiksIAogICAgICAgICAgICAgICAgICAgICAiU2FsZXMsIFRyYW5zcG9ydGF0aW9uLCBvciBQcm9kdWN0aW9uIiwKICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChgT2ZmZW5zZSBUeXBlYCwgIlNNVUdHTEUiKSwgCiAgICAgICAgICAgICAgICAgICAgICJTYWxlcywgVHJhbnNwb3J0YXRpb24sIG9yIFByb2R1Y3Rpb24iLAogICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGBPZmZlbnNlIFR5cGVgLCAiUFJPRFVDRSIpLCAKICAgICAgICAgICAgICAgICAgICAgIlNhbGVzLCBUcmFuc3BvcnRhdGlvbiwgb3IgUHJvZHVjdGlvbiIsCiAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoYE9mZmVuc2UgVHlwZWAsICJTRUxMIiksIAogICAgICAgICAgICAgICAgICAgICAiU2FsZXMsIFRyYW5zcG9ydGF0aW9uLCBvciBQcm9kdWN0aW9uIiwKICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChgT2ZmZW5zZSBUeXBlYCwgIlRSQUZGSUMiKSwgCiAgICAgICAgICAgICAgICAgICAgICJTYWxlcywgVHJhbnNwb3J0YXRpb24sIG9yIFByb2R1Y3Rpb24iLAogICAgICAgICAgICAgICJPdGhlciIpKSkpKSkpKQogIAoKam9pbmVkX2NvdW50cyA8LSAoc2VhdHRsZV9kcnVnc18xM18xNyAlPiUgY291bnQoWWVhciwgYERydWcgT2ZmZW5zZSBUeXBlYCkpICU+JQogIGxlZnRfam9pbigoU0ZfZHJ1Z3NfMTNfMTcgJT4lIGNvdW50KFllYXIsIGBEcnVnIE9mZmVuc2UgVHlwZWApKSwgYnkgPSBjKCJZZWFyIiwgIkRydWcgT2ZmZW5zZSBUeXBlIikpICU+JQogIGdhdGhlcihuLngsIG4ueSwga2V5ID0gQ2l0eSwgdmFsdWUgPSBJbmNpZGVudHMpICU+JQogIG11dGF0ZShDaXR5ID0gZmN0X3JlY29kZShDaXR5LAogICAgICAgICAgICAgICAgICAgICAgICAgICBTZWF0dGxlID0gIm4ueCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGBTYW4gRnJhbmNpc2NvYCA9ICJuLnkiKSkKCiNyZWZvcm1hdCBzb21lIGNhdGVnb3JpZXMgdGhhdCB3aWxsIGFwcGVhciBpbiB0aGUgcGxvdApqb2luZWRfY291bnRzIDwtIGpvaW5lZF9jb3VudHMgJT4lIAogIG11dGF0ZShgRHJ1ZyBPZmZlbnNlIFR5cGVgID0gYXMuZmFjdG9yKGBEcnVnIE9mZmVuc2UgVHlwZWApKSAlPiUKICBtdXRhdGUoYERydWcgT2ZmZW5zZSBUeXBlYCA9IAogICAgICAgICAgIGZjdF9yZWNvZGUoYERydWcgT2ZmZW5zZSBUeXBlYCwKICAgICAgICAgICAgICAgICAgICAgICIgU2FsZXMsIFRyYW5zcG9ydGF0aW9uLFxub3IgUHJvZHVjdGlvbiIgPSAiU2FsZXMsIFRyYW5zcG9ydGF0aW9uLCBvciBQcm9kdWN0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICIgUG9zc2Vzc2lvbiIgPSAiUG9zc2Vzc2lvbiIpKQoKcGxvdCA8LSBnZ3Bsb3Qoam9pbmVkX2NvdW50cyAlPiUgZmlsdGVyKGBEcnVnIE9mZmVuc2UgVHlwZWAgIT0gIk90aGVyIikpICsKICBnZW9tX2NvbChhZXMoeCA9IFllYXIsIHkgPSBJbmNpZGVudHMsIGZpbGwgPSBDaXR5LCBjb2xvciA9IGBEcnVnIE9mZmVuc2UgVHlwZWApLAogICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9ICJkb2RnZSIpICsKICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpICsKICBsYWJzKHggPSAieWVhciIsIHkgPSAiY291bnQiLAogICAgICAgdGl0bGUgPSAiRHJ1Zy1yZWxhdGVkIFBvbGljZSBJbmNpZGVudHM6IHBvc3Nlc3Npb24gdmVyc3VzIHRyYWZmaWNraW5nIikKCmdncGxvdGx5KHBsb3QpICU+JSBsYXlvdXQobWFyZ2luID0gbGlzdChiID0gNTAsIGwgPSA2MCwgciA9IDEwLCB0ID0gODApKQpgYGAKCgoKCmBgYHtyLCBmaWcuaGVpZ2h0ID0gNSwgZmlnLndpZHRoID0gMTB9CnNlYXR0bGVfZHJ1Z3NfMTNfMTcgPC0gc2VhdHRsZV9kcnVnc18xM18xNyAlPiUKICBtdXRhdGUoYERydWcgVHlwZWAgPSBpZmVsc2Uoc3RyX2RldGVjdChgT2ZmZW5zZSBUeXBlYCwgIk1BUklKVSIpLCAiTWFyaWp1YW5hIiwgICAgI3llcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoYE9mZmVuc2UgVHlwZWAsICJNRVRIIiksICJNZXRoYW1waGV0YW1pbmUiLCAgICAjeWVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChgT2ZmZW5zZSBUeXBlYCwgIkNPQ0FJTkUiKSwgIkNvY2FpbmUiLCAgI3llcyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGBPZmZlbnNlIFR5cGVgLCAiSEVST0lOIiksICJIZXJvaW4iLCAgI3llcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoYE9mZmVuc2UgVHlwZWAsICJQUkVTQ1JJUFRJT04iKSwgIlByZXNjcmlwdGlvbiIsICM/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChgT2ZmZW5zZSBUeXBlYCwgIlBJTEwvVEFCTEVUIiksICJQaWxsL1RhYmxldCIsICAjPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoYE9mZmVuc2UgVHlwZWAsICJIQUxMVUNJTk9HRU4iKSwgIkhhbGx1Y2lub2dlbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChgT2ZmZW5zZSBUeXBlYCwgIlNZTlRIRVRJQyIpLCAiU3ludGhldGljIiwgICM/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChgT2ZmZW5zZSBUeXBlYCwgIkFNUEhFVEFNSU5FIiksICJBbXBoZXRhbWluZSIsICN5ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGBPZmZlbnNlIFR5cGVgLCAiT1BJVU0iKSwgIk9waXVtIiwgI3llcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoYE9mZmVuc2UgVHlwZWAsICJQQVJBUEhFTkFMSUEiKSwgIlBhcmFwaGVybmFsaWEiLCAjeWVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3RoZXIiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkpKSkpKSkpKSkKICAKU0ZfZHJ1Z3NfMTNfMTcgPC0gU0ZfZHJ1Z3NfMTNfMTcgJT4lCiAgbXV0YXRlKGBEcnVnIFR5cGVgID0gaWZlbHNlKHN0cl9kZXRlY3QoRGVzY3JpcHQsICJNQVJJSlVBTkEiKSwgIk1hcmlqdWFuYSIsICAgI3llcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoRGVzY3JpcHQsICJDT0NBSU5FIiksICJDb2NhaW5lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KERlc2NyaXB0LCAiTUVUSC1BTVBIRVRBTUlORSIpLCAiTWV0aGFtcGhldGFtaW5lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KERlc2NyaXB0LCAiQkFSQklUVUFURVMiKSwgIkJhcmJpdHVhdGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KERlc2NyaXB0LCAiQ09OVFJPTExFRCBTVUJTVEFOQ0UiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29udHJvbGxlZCBTdWJzdGFuY2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoRGVzY3JpcHQsICJIQUxMVUNJTk9HRU5JQyIpLCAiSGFsbHVjaW5vZ2VuaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoRGVzY3JpcHQsICJBTVBIRVRBTUlORSIpLCAiQW1waGV0YW1pbmUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KERlc2NyaXB0LCAiTUVUSEFET05FIiksICJNZXRoYWRvbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoRGVzY3JpcHQsICJQQVJBUEhFUk5BTElBIiksICJQYXJhcGhlcm5hbGlhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KERlc2NyaXB0LCAiT1BJQVRFUyIpLCAiT3BpYXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChEZXNjcmlwdCwgIk9QSVVNIiksICJPcGl1bSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChEZXNjcmlwdCwgIkhFUk9JTiIpLCAiSGVyb2luIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPdGhlciIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApKSkpKSkpKSkpKSkKCmdncGxvdChTRl9kcnVnc18xM18xNykgKwogIGdlb21fYmFyKGFlcyhgRHJ1ZyBUeXBlYCkpICsKICBsYWJzKHRpdGxlID0gIlNhbiBGcmFuY2lzY28iKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA3NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKQoKc2VhdHRsZV9zZWxlY3RlZF9kcnVncyA8LSBzZWF0dGxlX2RydWdzXzEzXzE3ICU+JQogIGZpbHRlcihgRHJ1ZyBUeXBlYCAlaW4lIGMoIk1hcmlqdWFuYSIsICJDb2NhaW5lIiwgIk1ldGhhbXBoZXRhbWluZSIsICJIZXJvaW4iKSkKClNGX3NlbGVjdGVkX2RydWdzIDwtIFNGX2RydWdzXzEzXzE3ICU+JQogIGZpbHRlcihgRHJ1ZyBUeXBlYCAlaW4lIGMoIk1hcmlqdWFuYSIsICJDb2NhaW5lIiwgIk1ldGhhbXBoZXRhbWluZSIsICJIZXJvaW4iKSkKCmdncGxvdChzZWF0dGxlX3NlbGVjdGVkX2RydWdzKSArCiAgZ2VvbV9iYXIoYWVzKGBEcnVnIFR5cGVgKSkgKwogIGxhYnModGl0bGUgPSAiU2VhdHRsZSIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDY1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpCgpnZ3Bsb3QoU0Zfc2VsZWN0ZWRfZHJ1Z3MpICsKICBnZW9tX2JhcihhZXMoYERydWcgVHlwZWApKSArCiAgbGFicyh0aXRsZSA9ICJTYW4gRnJhbmNpc2NvIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNzUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkKCmpvaW5lZF9kcnVnX2NvdW50cyA8LSAoc2VhdHRsZV9zZWxlY3RlZF9kcnVncyAlPiUgY291bnQoWWVhciwgYERydWcgVHlwZWApKSAlPiUKICBsZWZ0X2pvaW4oKFNGX3NlbGVjdGVkX2RydWdzICU+JSBjb3VudChZZWFyLCBgRHJ1ZyBUeXBlYCkpLCBieSA9IGMoIlllYXIiLCAiRHJ1ZyBUeXBlIikpCiAgCmpvaW5lZF9kcnVnX2NvdW50cyA8LSBqb2luZWRfZHJ1Z19jb3VudHMgJT4lCiAgcmVuYW1lKFNlYXR0bGUgPSBuLngsIGBTYW4gRnJhbmNpc2NvYCA9IG4ueSkgJT4lCiAgZ2F0aGVyKFNlYXR0bGUsIGBTYW4gRnJhbmNpc2NvYCwga2V5ID0gQ2l0eSwgdmFsdWUgPSBjb3VudCkKICAKcGx0IDwtIGdncGxvdChqb2luZWRfZHJ1Z19jb3VudHMpICsgZ2VvbV9jb2woYWVzKHggPSBZZWFyLCB5ID0gY291bnQsIGZpbGwgPSBDaXR5LCBjb2xvciA9IGBEcnVnIFR5cGVgKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSAiZG9kZ2UiKQoKZ2dwbG90bHkocGx0KSAlPiUgbGF5b3V0KG1hcmdpbiA9IGxpc3QoYiA9IDUwLCBsID0gNjAsIHIgPSAxMCwgdCA9IDgwKSkKCgpgYGAKCgoKYGBge3IsIGZpZy5oZWlnaHQgPSAzLCBmaWcud2lkdGggPSA0fQpsaWJyYXJ5KGx1YnJpZGF0ZSkKbGlicmFyeShncmlkRXh0cmEpCgojZmlnLmhlaWdodCA9IDIsIGZpZy53aWR0aCA9IDMKCiNzZWF0dGxlX2RydWdzXzEzXzE3IDwtIHNlYXR0bGVfZHJ1Z3NfMTNfMTcgJT4lCiMgIG11dGF0ZShSX2RhdGUgPSBmbG9vcl9kYXRlKG1keV9obXMoYE9jY3VycmVkIERhdGUgb3IgRGF0ZSBSYW5nZSBTdGFydGAsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHogPSAiUFNUOFBEVCIpLCAiZGF5IikpCgojU0ZfZHJ1Z3NfMTNfMTcgPC0gU0ZfZHJ1Z3NfMTNfMTcgJT4lCiMgIG11dGF0ZShSX2RhdGUgPSBtZHkoRGF0ZSwgdHogPSAiUFNUOFBEVCIpKQoKc2VhdHRsZV9zZWxlY3RlZF9kcnVncyA8LSBzZWF0dGxlX2RydWdzXzEzXzE3ICU+JQogIGZpbHRlcihgRHJ1ZyBUeXBlYCAlaW4lIGMoIk1hcmlqdWFuYSIsICJDb2NhaW5lIiwgIk1ldGhhbXBoZXRhbWluZSIsICJIZXJvaW4iKSkKClNGX3NlbGVjdGVkX2RydWdzIDwtIFNGX2RydWdzXzEzXzE3ICU+JQogIGZpbHRlcihgRHJ1ZyBUeXBlYCAlaW4lIGMoIk1hcmlqdWFuYSIsICJDb2NhaW5lIiwgIk1ldGhhbXBoZXRhbWluZSIsICJIZXJvaW4iKSkKCm51bWJlcl9vZl9iaW5zIDwtIDc4CgpwbHRfc2VhdHRsZV9zZWxlY3RlZF9kcnVncyA8LSBnZ3Bsb3Qoc2VhdHRsZV9zZWxlY3RlZF9kcnVncykgKyAKICBnZW9tX2ZyZXFwb2x5KGFlcyh4ID0gUl9kYXRlLCBjb2xvciA9IGBEcnVnIFR5cGVgKSwgYmlucyA9IG51bWJlcl9vZl9iaW5zKSArCiAgc2NhbGVfeF9kYXRldGltZShkYXRlX2JyZWFrcyA9ICI0IG1vbnRocyIsIAogICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhhcy5QT1NJWGN0KCIyMDEyLzEyLzMxIiwgdHogPSAiUFNUOFBEVCIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuUE9TSVhjdCgiMjAxOC8wMS8wMSIsIHR6ID0gIlBTVDhQRFQiKSkpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDY1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBsYWJzKHkgPSAibnVtYmVyIHBlciBmb3J0bmlnaHQiLCB4ID0gIiIsCiAgICAgICB0aXRsZSA9ICJTZWF0dGxlIFBvbGljZSBJbmNpZGVudHMgUmVsYXRlZCB0byA0IFBvcHVsYXIgRHJ1Z3MiLAogICAgICAgY29sb3IgPSAiRHJ1ZzogIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDkpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpKSArCiAgZ3VpZGVzKHNpemUgPSBndWlkZV9sZWdlbmQob3JkZXIgPSAyKSkKCnBsdF9TRl9zZWxlY3RlZF9kcnVncyA8LSBnZ3Bsb3QoU0Zfc2VsZWN0ZWRfZHJ1Z3MpICsKICBnZW9tX2ZyZXFwb2x5KGFlcyh4ID0gUl9kYXRlLCBjb2xvciA9IGBEcnVnIFR5cGVgKSwgYmlucyA9IG51bWJlcl9vZl9iaW5zKSArCiAgc2NhbGVfeF9kYXRldGltZShkYXRlX2JyZWFrcyA9ICI0IG1vbnRocyIsIAogICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhhcy5QT1NJWGN0KCIyMDEyLzEyLzMxIiwgdHogPSAiUFNUOFBEVCIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuUE9TSVhjdCgiMjAxOC8wMS8wMSIsIHR6ID0gIlBTVDhQRFQiKSkpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDY1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBsYWJzKHkgPSAibnVtYmVyIHBlciBmb3J0bmlnaHQiLCB4ID0gIiIsCiAgICAgICB0aXRsZSA9ICJTYW4gRnJhbmNpc2NvIFBvbGljZSBJbmNpZGVudHMgUmVsYXRlZCB0byA0IFBvcHVsYXIgRHJ1Z3MiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDkpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpKQoKcGx0X3NlYXR0bGVfYWxsXzEzXzE3IDwtIHNlYXR0bGVfY29tcGxldGUgJT4lIAogIGZpbHRlcihZZWFyICVpbiUgMjAxMzoyMDE3KSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBSX2RhdGUpKSArIGdlb21fZnJlcXBvbHkoYmlucyA9IG51bWJlcl9vZl9iaW5zKSArCiAgc2NhbGVfeF9kYXRldGltZShkYXRlX2JyZWFrcyA9ICI0IG1vbnRocyIsIAogICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhhcy5QT1NJWGN0KCIyMDEyLzEyLzMxIiwgdHogPSAiUFNUOFBEVCIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuUE9TSVhjdCgiMjAxOC8wMS8wMSIsIHR6ID0gIlBTVDhQRFQiKSkpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDY1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBsYWJzKHkgPSAibnVtYmVyIHBlciBmb3J0bmlnaHQiLCB4ID0gIiIsCiAgICAgICB0aXRsZSA9ICJTZWF0dGxlIFBvbGljZSBJbmNpZGVudHM6IDIwMTMgdGhyb3VnaCAyMDE3IikgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDkpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpKQoKcGx0X1NGX2FsbF8xM18xNyA8LSBTRl9jb21wbGV0ZSAlPiUKICBmaWx0ZXIoWWVhciAlaW4lIDIwMTM6MjAxNykgJT4lCiAgZ2dwbG90KGFlcyh4ID0gUl9kYXRlKSkgKyBnZW9tX2ZyZXFwb2x5KGJpbnMgPSBudW1iZXJfb2ZfYmlucykgKwogIHNjYWxlX3hfZGF0ZXRpbWUoZGF0ZV9icmVha3MgPSAiNCBtb250aHMiLCAKICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoYXMuUE9TSVhjdCgiMjAxMi8xMi8zMSIsIHR6ID0gIlBTVDhQRFQiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLlBPU0lYY3QoIjIwMTgvMDEvMDEiLCB0eiA9ICJQU1Q4UERUIikpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgbGFicyh5ID0gIm51bWJlciBwZXIgZm9ydG5pZ2h0IiwgeCA9ICIiLAogICAgICAgdGl0bGUgPSAiU2FuIEZyYW5jaXNjbyBQb2xpY2UgSW5jaWRlbnRzOiAyMDEzIHRocm91Z2ggMjAxNyIpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA5KSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSkKCmdyaWQuYXJyYW5nZShwbHRfc2VhdHRsZV9hbGxfMTNfMTcsIHBsdF9TRl9hbGxfMTNfMTcsIAogICAgICAgICAgICAgcGx0X1NGX3NlbGVjdGVkX2RydWdzLCBwbHRfc2VhdHRsZV9zZWxlY3RlZF9kcnVncywgIAogICAgICAgICAgICAgbGF5b3V0X21hdHJpeCA9IHJiaW5kKGMoMSwgMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyg0LCAzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKDQsIE5BKSksCiAgICAgICAgICAgICBoZWlnaHRzID0gYyg1LCA1LCAxKSkKICAgICAgICAgICAgIApgYGAKCgoKCgo=